<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>长度最小的子数组</title>
    <style>
        .red{
            width: 360px;
            background-color: brown;
        }
    </style>
</head>
<body>
    
    <div>
        <div>题目:给定一个含有 n 个正整数的数组和一个正整数 target 。<br>

            找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ，并返回其长度。如果不存在符合条件的子数组，返回 0 。
        </div>
        <div class="red">代码中还设置了其余的测试组,需要手动切换</div>
        <br>
        <div id="target"></div>
        <div id="nums"></div>
        <div id="result"></div>
        <button onclick="min()">结果</button>
    </div>
    <script>
            
            let target = 7;
            let nums = [2,1,3,2,4,3];
            // target = 4;
            // nums = [1,4,4,4]
            // target = 11;
            // nums = [1,1,1,1,1,1,1,1]
            let t = document.getElementById("target");
            t.innerHTML = "目标求和数字:"+target;

            let n = document.getElementById("nums");
            n.innerHTML = "数组:"+"["+nums+"]";

            let r = document.getElementById("result");
            r.innerHTML = "结果为:"

        var min= function() {
        // 滑动窗口
        // 思路:让起始位置和终止位置都从数组第一位开始,让终止位置往后走,直到期间元素的和>=s,将此时的长度保存;
        // 之后每当元素的和>=s时,改变起始位置,并记录数组长度,依次比较数组长度,选择最小的数组长度。
        // target = 11;
        // nums= [1,1,1,1,1,1,1,1];
    
        // 首先确定起始数组的长度
        var length = nums.length;
        // 创造起始位置和终止位置,都先从左端开始，
        let left=0;
        let right=0;
        // 计算元素的和
            let  sum=0;
        // 记录符合条件的数组的长度,要选择最小的长度，将起始长度定位数组长度,比较之后让slength成为其中较小的数;
        let slength=length+1;
        // return slength;
        while(right<length) {
            // console.log(right)

            sum+=nums[right];
            right++;
            if(sum>=target) {
                // console.log(sum);
                // console.log(right-left)

                if(slength>(right-left)) {
                    slength=right-left;
                    // console.log(slength);
                    //此处已经获得这一次的长度，将sum减去起始位置的数字,进行第二次;
                    // console.log(left);
                    sum-=nums[left++];
                    left++;
                    // console.log(sum)
                };
            }
        }
        console.log(slength>length?0:slength);
        r.innerHTML = "结果为:"+slength;
    };
    </script>
</body>
</html>